package oop

import (
	"fmt"
)

// type关键字定义类型,struct结构体
// 定义结构体类型
// 大写public，小写private
type Node struct {
	Value       int
	Left, Right *Node
}

// 结构体定义方法，放在结构体外面
// 注：函数名前面加()，值接收者，类比静态扩展类，都能.访问成员
// 传值，go语言全部传值，用指针传地址
func (node Node) Print() {
	fmt.Print(node.Value, " ")
}

// 结构体定义方法，放在结构体外面
// 注：函数名前面加()，指针接收者，类比静态扩展类，都能.访问成员
// 传地址，go语言全部传值，用指针传地址
func (node *Node) SetValue(value int) {
	if node == nil { //nil指针，一样可以安全使用，但是运行后也会报错
		fmt.Println("Setting Value to nil " +
			"node. Ignored.")
		return
	}
	node.Value = value
}

// 使用自定义工厂函数，类比构造 函数，返回局部变量地址
// go语言中结构体不需要知道分配到堆或栈，由编译器分配，局部变量给外部用会分配到堆上参与垃圾回收，不给外部调用会分配到栈中
func CreateNode(value int) *Node {
	return &Node{Value: value}
}
